// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/memory/scoped_ptr.h"
#include "gpu/config/gpu_blacklist.h"
#include "gpu/config/gpu_control_list_jsons.h"
#include "gpu/config/gpu_feature_type.h"
#include "gpu/config/gpu_info.h"
#include "testing/gtest/include/gtest/gtest.h"

const char kOsVersion[] = "10.6.4";

namespace gpu {

class GpuBlacklistTest : public testing::Test {
public:
    GpuBlacklistTest() { }

    ~GpuBlacklistTest() override { }

    const GPUInfo& gpu_info() const
    {
        return gpu_info_;
    }

    void RunFeatureTest(const std::string& feature_name,
        GpuFeatureType feature_type)
    {
        const std::string json = "{\n"
                                 "  \"name\": \"gpu blacklist\",\n"
                                 "  \"version\": \"0.1\",\n"
                                 "  \"entries\": [\n"
                                 "    {\n"
                                 "      \"id\": 1,\n"
                                 "      \"os\": {\n"
                                 "        \"type\": \"macosx\"\n"
                                 "      },\n"
                                 "      \"vendor_id\": \"0x10de\",\n"
                                 "      \"device_id\": [\"0x0640\"],\n"
                                 "      \"features\": [\n"
                                 "        \""
            + feature_name + "\"\n"
                             "      ]\n"
                             "    }\n"
                             "  ]\n"
                             "}";

        scoped_ptr<GpuBlacklist> blacklist(GpuBlacklist::Create());
        EXPECT_TRUE(blacklist->LoadList(json, GpuBlacklist::kAllOs));
        std::set<int> type = blacklist->MakeDecision(
            GpuBlacklist::kOsMacosx, kOsVersion, gpu_info());
        EXPECT_EQ(1u, type.size());
        EXPECT_EQ(1u, type.count(feature_type));
    }

protected:
    void SetUp() override
    {
        gpu_info_.gpu.vendor_id = 0x10de;
        gpu_info_.gpu.device_id = 0x0640;
        gpu_info_.driver_vendor = "NVIDIA";
        gpu_info_.driver_version = "1.6.18";
        gpu_info_.driver_date = "7-14-2009";
        gpu_info_.machine_model_name = "MacBookPro";
        gpu_info_.machine_model_version = "7.1";
        gpu_info_.gl_vendor = "NVIDIA Corporation";
        gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
    }

    void TearDown() override { }

private:
    GPUInfo gpu_info_;
};

TEST_F(GpuBlacklistTest, CurrentBlacklistValidation)
{
    scoped_ptr<GpuBlacklist> blacklist(GpuBlacklist::Create());
    EXPECT_TRUE(blacklist->LoadList(
        kSoftwareRenderingListJson, GpuBlacklist::kAllOs));
}

#define GPU_BLACKLIST_FEATURE_TEST(test_name, feature_name, feature_type) \
    TEST_F(GpuBlacklistTest, test_name)                                   \
    {                                                                     \
        RunFeatureTest(feature_name, feature_type);                       \
    }

GPU_BLACKLIST_FEATURE_TEST(Accelerated2DCanvas,
    "accelerated_2d_canvas",
    GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS)

GPU_BLACKLIST_FEATURE_TEST(GpuCompositing,
    "gpu_compositing",
    GPU_FEATURE_TYPE_GPU_COMPOSITING)

GPU_BLACKLIST_FEATURE_TEST(WebGL,
    "webgl",
    GPU_FEATURE_TYPE_WEBGL)

GPU_BLACKLIST_FEATURE_TEST(Flash3D,
    "flash_3d",
    GPU_FEATURE_TYPE_FLASH3D)

GPU_BLACKLIST_FEATURE_TEST(FlashStage3D,
    "flash_stage3d",
    GPU_FEATURE_TYPE_FLASH_STAGE3D)

GPU_BLACKLIST_FEATURE_TEST(FlashStage3DBaseline,
    "flash_stage3d_baseline",
    GPU_FEATURE_TYPE_FLASH_STAGE3D_BASELINE)

GPU_BLACKLIST_FEATURE_TEST(AcceleratedVideoDecode,
    "accelerated_video_decode",
    GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE)

GPU_BLACKLIST_FEATURE_TEST(AcceleratedVideoEncode,
    "accelerated_video_encode",
    GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE)

GPU_BLACKLIST_FEATURE_TEST(PanelFitting,
    "panel_fitting",
    GPU_FEATURE_TYPE_PANEL_FITTING)

GPU_BLACKLIST_FEATURE_TEST(GpuRasterization,
    "gpu_rasterization",
    GPU_FEATURE_TYPE_GPU_RASTERIZATION)

} // namespace gpu
